續上篇 Day 14 讀 Go Concurrency Patterns - Rob Pike I
基於某種原因,我們有時侯是想要保持順序,也就是 Joe 和 Ann 兩個人各自隨機時間印出 0 , 兩個人在隨幾印出 1,以此類推等等。注意:這和上上一次的例子並不一樣,那一組例子是 Ann 可能已經準備好了,但是必須等 Joe,現在是 Joe 和 Ann 在隨機時間印出之後才等待。
我們可以在 generator (boring function) 傳送的訊息中傳送一個 Message,裏邊放一個 channel,並且用這個 channel 控制是否讓下一輪的 Message 傳送
因此我們將 boring 改寫一下,完整程式在這 link
還記得 fan in 嗎?兩個 goroutine 同時傳送給一個 channel,快的那個會先送出,這不就跟 select 的意思一樣嗎,select 監聽兩個 channel,兩個 channel 誰先 ready,就走那個 case。那就用 select 改寫吧
接下來我們來想想,boring generator 要怎麼停止傳送訊息吧。
在 golang 中 timeout 和 select 也很常一起使用。這個的例子是,boring generator 每次發出的訊息間隔不花超過 1 秒,超過的話就 return。
另一種常見的使用方式是,讓 boring function 在一個時間內傳送訊息,以下的例子就是在五秒內傳送訊息,過了五秒後就 return。
我們也可以設計一個 quit channel 通知 boring generator 不要再繼續送訊息
我們通知了 boring generator 著手進行結束的工作,但是我們怎麼知道 boring generator 已經結束了,那就讓 boring generator 結束前通知我吧,完整程式可看 link
今天就到這吧,明天就是這演講的最後一篇。